package com.atguigu.servicebase.config;

import com.google.common.base.Predicates;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @Auther 赵乾坤
 * @Date 2021-06-25 22:51
 * Swagger2介绍
 * 前后端分离开发模式中，api文档是最好的沟通方式。
 * Swagger 是一个规范和完整的框架，用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
 * 及时性 (接口变更后，能够及时准确地通知相关前后端开发人员)
 * 规范性 (并且保证接口的规范性，如接口的地址，请求方式，参数及响应格式和错误信息)
 * 一致性 (接口信息一致，不会出现因开发人员拿到的文档版本不一致，而出现分歧)
 * 可测性 (直接在接口文档上进行测试，以方便理解业务)
 */
@ApiModel("Swagger2配置类")
@Configuration//配置类
@EnableSwagger2//开启Swagger2
public class SwaggerConfig {

    @Bean
    @ApiModelProperty("配置Swagger的Docket的bean实例")
    public Docket webApiConfig(){

        return new Docket(DocumentationType.SWAGGER_2)//文档类型.SWAGGER_2
                .groupName("webApi")//分组名称叫什么
                .apiInfo(webApiInfo())//api信息
                .select()
                     /*
                RequestHandlerSelectors，配置要扫描接口的方式
                RequestHandlerSelectors.any()：扫描报的全部
                RequestHandlerSelectors.basePackage("com.lucas.controller")扫描指定的包
                RequestHandlerSelectors.none()都不扫描
                RequestHandlerSelectors.withClassAnnotation扫描类上的注解:例如：
                RequestHandlerSelectors.withClassAnnotation(RestController.class)GetMapping
                RequestHandlerSelectors.withMethodAnnotation扫描方法上的注解，例如:
                RequestHandlerSelectors.withMethodAnnotation(GetMapping.class)
                 */
                //RequestHandlerSelectors:配置要扫描接口的方式
                //basePackage:指定要扫描的包
                //any()扫描全部 none()不扫描
                //过滤某路径 还可以通过正则表达式进行控制
                .paths(Predicates.not(PathSelectors.regex("/admin/.*")))//admin开头不需要访问
                .paths(Predicates.not(PathSelectors.regex("/error.*")))//error开头不需要访问
                .build();

    }

    @ApiModelProperty("配置文档信息")
    private ApiInfo webApiInfo(){

        return new ApiInfoBuilder()
                .title("网站-课程中心API文档")//标题
                .description("本文档描述了课程中心微服务接口定义")//描述
                .version("1.0")//版本
                .contact(new Contact("zqk", "http://atguigu.com", "zqkzuishuai@sian.com"))//联系人信息
                .build();

    }
}
